package com.w3c.pragmatic.mongo;

import com.mongodb.client.result.UpdateResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * 使用MongoTemplate操纵FileTemplate
 *
 * @author wangdong
 * @since 2025/7/17 14:45
 */
@Slf4j
@Service
public class FileTemplateService {

  @Resource private MongoTemplate mongoTemplate;

  /**
   * 保存文件模板(id必填)
   *
   * <p>如果两次保存的id一致,那么最后保存的会覆盖之前的数据
   *
   * @param fileTemplate 对象
   */
  public FileTemplate saveTemplate(FileTemplate fileTemplate) {
    return mongoTemplate.save(fileTemplate);
  }

  /**
   * 查找并编辑
   *
   * <p>如果查询到数据则更新，如果查询不到数据则不更新
   *
   * <p>返回的是更新后最新的数据对象
   *
   * @param fileTemplate 对象
   */
  public FileTemplate findAndModify(FileTemplate fileTemplate) {
    Query query =
        new Query(
            Criteria.where("templateType")
                .is(fileTemplate.getTemplateType())
                .and("templateCode")
                .is(fileTemplate.getTemplateCode()));
    Update update =
        new Update()
            .set("templateContent", fileTemplate.getTemplateContent())
            .set("createTime", fileTemplate.getCreateTime());
    return mongoTemplate.findAndModify(query, update, FileTemplate.class);
  }

  /**
   * 按照类型批量更新
   *
   * @param fileTemplate 对象
   */
  public void updateMulti(FileTemplate fileTemplate) {
    Query query = new Query(Criteria.where("templateType").is(fileTemplate.getTemplateType()));
    Update update = new Update().set("templateContent", fileTemplate.getTemplateContent());
    UpdateResult updateResult = mongoTemplate.updateMulti(query, update, FileTemplate.class);
    log.info("批量更新匹配到的数据={}", updateResult);
  }

  /**
   * 查询所有数据
   *
   * @return 列表
   */
  public List<FileTemplate> findAll() {
    return mongoTemplate.findAll(FileTemplate.class);
  }

  /**
   * 通过id查询唯一数据
   *
   * @param id 主键id
   * @return 对象
   */
  public FileTemplate getById(Long id) {
    return mongoTemplate.findById(id, FileTemplate.class);
  }

  /**
   * 通过唯一条件查询数据
   *
   * @param templateType 类型
   * @param templateCode 编码
   * @return 对象
   */
  public FileTemplate getByUnique(String templateType, String templateCode) {
    Query query =
        new Query(
            Criteria.where("templateType").is(templateType).and("templateCode").is(templateCode));
    return mongoTemplate.findOne(query, FileTemplate.class);
  }

  /**
   * 通过唯一条件删除
   *
   * @param templateType 类型
   * @param templateCode 编码
   */
  public void removeByUnique(String templateType, String templateCode) {
    Query query =
        new Query(
            Criteria.where("templateType").is(templateType).and("templateCode").is(templateCode));
    mongoTemplate.remove(query, FileTemplate.class);
  }
}
